//package com.wq.httpclientcore.config;
//
//import com.wq.httpclientcore.annotation.HttpClient;
//import com.wq.httpclientcore.model.HttpResponseWrapper;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.http.*;
//import org.springframework.web.bind.annotation.*;
//import org.springframework.web.client.HttpStatusCodeException;
//import org.springframework.web.client.RestTemplate;
//
//import java.lang.annotation.Annotation;
//import java.lang.reflect.InvocationHandler;
//import java.lang.reflect.Method;
//import java.util.HashMap;
//import java.util.Map;
//
///**
// * HttpClientInvocationHandler
// * 负责处理动态代理的 HTTP 请求
// *
// * @author wq
// */
//public class HttpClientInvocationHandler implements InvocationHandler {
//
//    private static final Logger logger = LoggerFactory.getLogger(HttpClientInvocationHandler.class);
//
//    private final RestTemplate restTemplate;
//    private final Class<?> clazz;
//
//    public HttpClientInvocationHandler(RestTemplate restTemplate, Class<?> clazz) {
//        this.restTemplate = restTemplate;
//        this.clazz = clazz;
//    }
//
//    @Override
//    public Object invoke(Object proxy, Method method, Object[] args) {
//        // 解析 URL 和 HTTP 方法
//        String url = resolveUrl(method);
//        HttpMethod httpMethod = resolveHttpMethod(method);
//
//        // 解析请求参数
//        Map<String, Object> pathVariables = new HashMap<>();
//        Map<String, Object> queryParams = new HashMap<>();
//        Object requestBody = resolveRequestBody(method, args);
//
//        // 替换 URL 中的路径变量
//        url = replacePathVariables(url, pathVariables);
//
//        // 添加查询参数
//        url = appendQueryParams(url, queryParams);
//
//        // 构造请求头
//        HttpHeaders headers = new HttpHeaders();
//        headers.setContentType(MediaType.APPLICATION_JSON);
//
//        // 构造 HttpEntity
//        HttpEntity<Object> httpEntity = new HttpEntity<>(requestBody, headers);
//
//        logger.info("发送请求=====> request: {} {}, Headers: {}, Body: {}", httpMethod, url, headers, requestBody);
//
//        try {
//            // 获取方法的实际返回类型（例如 TestModel）
//            Class<?> returnType = method.getReturnType();
//
//            // 如果返回类型是 HttpResponseWrapper，则提取其泛型类型
//            if (returnType.equals(HttpResponseWrapper.class)) {
//                // 获取 HttpResponseWrapper 的泛型类型（例如 TestModel）
//                Class<?> actualType = (Class<?>) ((java.lang.reflect.ParameterizedType) method.getGenericReturnType())
//                        .getActualTypeArguments()[0];
//
//                // 发送 HTTP 请求，并将响应体映射到实际类型
//                ResponseEntity<?> responseEntity = restTemplate.exchange(url, httpMethod, httpEntity, actualType);
//
//                logger.info("请求成功=====> response: {}, Result: {}", responseEntity.getStatusCode(), responseEntity.getBody());
//
//                // 将响应封装到 HttpResponseWrapper 中
//                return new HttpResponseWrapper<>(responseEntity.getBody(), responseEntity.getStatusCode().value(), null);
//            } else {
//                // 如果返回类型不是 HttpResponseWrapper，直接返回响应体
//                ResponseEntity<?> responseEntity = restTemplate.exchange(url, httpMethod, httpEntity, returnType);
//                return responseEntity.getBody();
//            }
//        } catch (HttpStatusCodeException e) {
//            logger.error("HTTP 请求失败，status： {}, Response: {}", e.getStatusCode(), e.getResponseBodyAsString(), e);
//            return new HttpResponseWrapper<>(null, e.getStatusCode().value(), e.getMessage());
//        } catch (Exception e) {
//            logger.error("请求失败: {}", e.getMessage(), e);
//            return new HttpResponseWrapper<>(null, HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
//        }
//    }
//
//    /**
//     * 解析请求体
//     */
//    private Object resolveRequestBody(Method method, Object[] args) {
//        Annotation[][] parameterAnnotations = method.getParameterAnnotations();
//        for (int i = 0; i < parameterAnnotations.length; i++) {
//            for (Annotation annotation : parameterAnnotations[i]) {
//                if (annotation instanceof RequestBody) {
//                    return args[i];
//                }
//            }
//        }
//        return null;
//    }
//
//    /**
//     * 替换 URL 中的路径变量
//     */
//    private String replacePathVariables(String url, Map<String, Object> pathVariables) {
//        for (Map.Entry<String, Object> entry : pathVariables.entrySet()) {
//            url = url.replace("{" + entry.getKey() + "}", entry.getValue().toString());
//        }
//        return url;
//    }
//
//    /**
//     * 添加查询参数
//     */
//    private String appendQueryParams(String url, Map<String, Object> queryParams) {
//        if (!queryParams.isEmpty()) {
//            StringBuilder queryString = new StringBuilder("?");
//            for (Map.Entry<String, Object> entry : queryParams.entrySet()) {
//                queryString.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
//            }
//            url += queryString.substring(0, queryString.length() - 1);
//        }
//        return url;
//    }
//
//    /**
//     * 解析 URL
//     */
//    private String resolveUrl(Method method) {
//        HttpClient httpClientAnnotation = clazz.getAnnotation(HttpClient.class);
//        String baseUrl = httpClientAnnotation != null ? httpClientAnnotation.baseUrl() : "";
//
//        RequestMapping classRequestMapping = clazz.getAnnotation(RequestMapping.class);
//        String classUrl = classRequestMapping != null ? classRequestMapping.value()[0] : "";
//
//        GetMapping getMapping = method.getAnnotation(GetMapping.class);
//        PostMapping postMapping = method.getAnnotation(PostMapping.class);
//        RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
//
//        String methodUrl = "";
//        if (getMapping != null) {
//            methodUrl = getMapping.value()[0];
//        } else if (postMapping != null) {
//            methodUrl = postMapping.value()[0];
//        } else if (requestMapping != null) {
//            methodUrl = requestMapping.value()[0];
//        }
//
//        return baseUrl + classUrl + methodUrl;
//    }
//
//    /**
//     * 解析 HTTP 方法
//     */
//    private HttpMethod resolveHttpMethod(Method method) {
//        if (method.getAnnotation(GetMapping.class) != null) {
//            return HttpMethod.GET;
//        } else if (method.getAnnotation(PostMapping.class) != null) {
//            return HttpMethod.POST;
//        } else if (method.getAnnotation(RequestMapping.class) != null) {
//            RequestMethod requestMethod = method.getAnnotation(RequestMapping.class).method()[0];
//            return HttpMethod.valueOf(requestMethod.name());
//        }
//        throw new UnsupportedOperationException("不支持的 HTTP 方法");
//    }
//}